VoK-Security 提供三個限定權限的 annotation
@AllowRoles
- 須帶參數roles, 若未帶參數,則無任何使用者擁有進入此畫面權限@AllowAll
- 所有使用者皆有權限,無論有無登入@AssowAllUsers
- 所有已登入使用者皆有權限根據昨天所設定的角色分配,分配新增/修改/刪除學生權限。
EditStudent.kt
,在 class 前加上 annotation@Route("edit-student", layout = MainLayout::class)
@AllowRoles("administrator")
class EditStudent : KComposite(), HasUrlParameter<Long> {
AllStudentsView.kt
裡,但此畫面任一登入使用者皆有觀看權限,需要使用其他方法限制權限。 if (Session.loginService.isUserInRole("administrator")) {
addButtonColumn(VaadinIcon.TRASH, "delete") {
confirmDialog(text = "是否確定刪除${it.name}的資料?") {
it.delete()
this.refresh()
}
}
}
第一行,判斷登入使用者是否具有 administrator 權限
加好角色限制annotation後,需要設定在UI跳轉到畫面前進行檢查。
在 Bootstrap.kt
contextInitialized()
方法加上
VaadinOnKotlin.loggedInUserResolver = object : LoggedInUserResolver{
override fun isLoggedIn(): Boolean = Session.loginService.isLoggedIn
override fun getCurrentUserRoles(): Set<String> = Session.loginService.getCurrentUserRoles()
}
請開啟MainLayout.kt
,在beforeEnter()
方法加上檢查
override fun beforeEnter(event: BeforeEnterEvent) {
if (event.navigationTarget != LoginView::class.java && !Session.loginService.isLoggedIn){
event.rerouteTo(LoginView::class.java)
}else{
VokSecurity.checkPermissionsOfView(event.navigationTarget)
}
}
在MainLayout
啟動檢查的方式僅適用layout為 MainLayout之畫面 @Route(path, layout = MainLayout::class)
。倘若希望整個系統執行時,無論有無指定 layout 皆須事先判斷則採用註冊 Listener方法。
SysInitListener.kt
package com.example.vok
import com.vaadin.flow.server.ServiceInitEvent
import com.vaadin.flow.server.VaadinServiceInitListener
import eu.vaadinonkotlin.vaadin10.Session
import eu.vaadinonkotlin.vaadin10.VokSecurity
class SysInitListener: VaadinServiceInitListener {
override fun serviceInit(event: ServiceInitEvent) {
event.source.addUIInitListener { uiInitEvent ->
uiInitEvent.ui.addBeforeEnterListener { beforeEnterEvent ->
if (!Session.loginService.isLoggedIn && beforeEnterEvent.navigationTarget != LoginView::class.java){
beforeEnterEvent.rerouteTo(LoginView::class.java)
}else{
VokSecurity.checkPermissionsOfView(beforeEnterEvent.navigationTarget)
}
}
}
}
}
web/src/main/resource/META-INF/services/
開啟新檔 com.vaadin.flow.server.VaadinServiceInitListener
,寫入含 package的class name即可。com.example.vok.SysInitListener
最後記得在每個畫面賦予適合權限,否則會出 AccessRejectedException